# 定义工具类
import json
import time

from selenium import webdriver
from selenium.common import NoSuchElementException


class UtilsDriver:
    _mp_driver = None  # 表示自媒体平台的浏览器驱动
    _mis_driver = None  # 表示后台管理系统的浏览器驱动

    _quit_mis_driver = True  # 加一个退出mis驱动对象的标记

    # 定义获取自媒体浏览器驱动
    @classmethod
    def get_mp_driver(cls):
        if cls._mp_driver is None:
            cls._mp_driver = webdriver.Chrome()
            cls._mp_driver.maximize_window()
            cls._mp_driver.get("")
        return cls._mp_driver

    # 定义退出浏览器驱动
    @classmethod
    def quit_mp_driver(cls):
        if cls._mp_driver is not None:
            cls._mp_driver.quit()
            cls._mp_driver = None

    # 获取后台管理系统的浏览器驱动
    @classmethod
    def get_mis_driver(cls):
        if cls._mis_driver is None:
            cls._mis_driver = webdriver.Chrome()
            cls._mis_driver.maximize_window()
            cls._mis_driver.get("")
        return cls._mis_driver

    # 退出后台管理系统浏览器驱动
    @classmethod
    def quit_mis_driver(cls):
        if cls._mis_driver and cls._quit_mis_driver:  # cls._mis_driver为none时返回false
            cls._mis_driver.quit()
            cls._mis_driver = None


# 封装一个选择频道的方法
def choice_channel(driver, element, channel):
    """
    :param driver: 浏览器驱动对象
    :param element:元素对象
    :param channel:要选择的文本内容
    :return:
    """
    element.click()  # 点击选择框弹出要选择的内容
    time.sleep(1)  # 强制停两秒防止点快未加载
    # [@class='el-select-dropdown wrap el-scrollbar wrap' ]这个是获取那个下拉框，
    # *[text()='{}'这个是获取下拉框里面的class的text=什么值的那个元素
    # 也就是获取下拉框class下的那个元素
    xpath = "//*[@class='el-select-dropdown wrap el-scrollbar wrap' ]//*[text()='{}']'".format(
        channel)  # 这个channel值会给text()='{}'
    driver.find_element_by_xpath(xpath).click()


# 封装一个方法判断元素是否存在（页面上方的提示框）
def is_exist(driver, text):
    """
    想要判断是否执行成功通过页面弹出的提示，想要获取此元素因为它只有几秒无法定位，只能根据其文本信息找元素若能找到则执行成功反之失败
    :param driver: 浏览器驱动对象
    :param text: 定位元素的文本内容
    :return:
    """
    # //*[contains(text(), '{}')]这个xpath的意思是若找到一个元素中包含text（）文本中的值就会返回本元素
    xpath = "//*[contains(text(), '{}')]".format(text)
    try:
        time.sleep(2)  # 因为点的太快时会又没弹出的情况
        return driver.find_element_by_xpath(xpath)
    except Exception as e:
        return False


# 封装测试数据
def get_case_data(filename):  # 文件名不写死
    with open(filename, encoding='utf-8') as f:
        data = json.load(f)
        list_case = []
        for case in data.values():
            list_case.append(tuple(case.values()))  # tuple强制转换为元组
        return list_case



